﻿// ## 2023/11/04 # 墨玉丹青 # 参考000结构体将个人功能移出到该结构体中 ##
 

//如想在一个文件写，可以考虑多加几个namespace
namespace 结构体读取与储存_墨玉丹青
{
	/// KEY index 的类型是 (uint16),所以最高支持65535,已达上限， 测试无法扩增

	//通过key区分每个结构体类型，这样可以使每个元素都能分别达到65535的上限

	const int KEY_据点 = pk::hash("据点结构体_墨玉");
	const int KEY_索引_追加_据点起始 = 0;					// 索引追加建筑结构体 uint32数量为30个，据点共86个。总计2580，上限uint32数=65000/86=755

	const int KEY_武将 = pk::hash("武将结构体_墨玉");
	const int KEY_索引_追加_武将起始 = 0;					// 索引追加武将结构体 uint32数量为20个，武将共1100个。总计22000，上限uint32数=65000/1100=59

	const int KEY_部队 = pk::hash("部队结构体_墨玉");
	const int KEY_索引_追加_部队起始 = 0;					// 索引追加部队结构体 uint32数量为10个，部队共1000个。总计10000，上限uint32数=65000/1000=65

	const int KEY_势力 = pk::hash("势力结构体_墨玉");
	const int KEY_索引_追加_势力起始 = 0;					// 索引追加势力结构体 uint32数量为20个，势力共46个。总计920，上限uint32数=65000/46=1413

	const int KEY_地名 = pk::hash("地名结构体_墨玉");
	const int KEY_索引_追加_地名起始 = 0;					// 索引追加地名结构体 uint32数量为20个，地名共221个。总计4420，上限uint32数=65000/221=294

	const int KEY_其他 = pk::hash("其他结构体_墨玉");
	const int KEY_索引_追加_组队起始 = 0;					// 索引追加自动组队结构体 uint32数量为3个，记录数共300个。总计900
	const int KEY_索引_追加_设定起始 = 10000;					// 索引追加游戏基础设定结构体 uint32数量为135个

	//武将id*3 16*3+兵种8*2 + 频次16
	//使用3个unit32存，给100个位置，那就是300
	//是否有必要加入玩家自定义参数的储存--如果加入，那kre中的更改将失效，直到重开游戏或游戏中改设定
	class Main
	{
		Main()
		{
			pk::bind2(102, pk::trigger102_t(剧本初始化_结构体_信息读取),999);
			pk::bind(105, pk::trigger105_t(儲存_结构体_信息储存));
		}
		void 儲存_结构体_信息储存(int file_id,pk::s11writer@ w) //儲存
		{
			for (int i = 0; i < 武将_末; i++)
			{
				person_ex_moyu[i].update(i);
				for (int j = 0; j < 武将结构体_uint32数_墨玉; j++)
					pk::store(KEY_武将, (KEY_索引_追加_武将起始 + (i * 武将结构体_uint32数_墨玉 + j)), person_ex_info_temp_moyu[j][i]);
			}
		}

		void 剧本初始化_结构体_信息读取()
		{
			//重新开始游戏时，初始化数据
			if (!pk::get_scenario().loaded)
			{
				for (int i = 0; i < 武将_末; ++i)
				{
					person_ex_moyu[i].pregnancy = 0;
				}
			}
			if (pk::get_scenario().loaded)
			{
				// pk::trace("读取结构体loaded");
				for (int i = 0; i < 武将_末; i++)
				{
					for (int j = 0; j < 武将结构体_uint32数_墨玉; j++)
						person_ex_info_temp_moyu[j][i] = uint32(pk::load(KEY_武将, (KEY_索引_追加_武将起始 + (i * 武将结构体_uint32数_墨玉 + j)), 0));
					//借用位置写个武将装备马匹的设定,读档时设置
					personinfo_moyu person_t(i);
					person_ex_moyu[i] = person_t;		 
				}

				

			}
		}

	}

	Main main;
}
const int 武将结构体_uint32数_墨玉 = 20;
array<array<uint32>> person_ex_info_temp_moyu(武将结构体_uint32数_墨玉, array<uint32>(武将_末, uint32(0)));
array<personinfo_moyu> person_ex_moyu(武将_末);

//存档时将结构体转为数组再存
//读档时将数组转换为结构体读取
///struct 和 class没有本质区别，只是class默认类外不可访问。不过pk2.2class是可以类外访问的
//将多个信息组合成两个int64
class personinfo_moyu
{
	uint16 person_id_t;
	//墨玉丹青添加-怀孕判定
	int8 pregnancy = 0;//大于0即为怀孕

   //墨玉丹青-------

	//初始化
	personinfo_moyu(int person_id)
	{
		person_id_t = person_id;
		get_info(person_id);
	}

	//下面这种写法用于定义全局变量，先声明，然后用get_info获取信息后使用
	personinfo_moyu() {}

	void get_info(int person_id)
	{
		fromInt32_1(person_ex_info_temp_moyu[1][person_id]);
	}

	void update(int person_id)
	{
	
		person_ex_info_temp_moyu[1][person_id] = toInt32_1();
	}

	uint32 toInt32_1(void)
	{
		uint32 x = pregnancy;
		return x;
	}

	void fromInt32_1(uint32 x)
	{
		pregnancy = x;

	}
	//---
}

